import { _decorator, Component, Vec3, EventMouse, input, Input, Animation } from "cc";
const { ccclass, property } = _decorator;

// 添加一个放大比
export const BLOCK_SIZE = 40;

@ccclass('PlayerController')
export class PlayerController extends Component {

    @property(Animation)
    BodyAnim: Animation = null;
    // 是否开始跳跃： _startJump，用于判断角色是否在跳跃状态
    private _startJump: boolean = false;
    // 跳跃步数：一步或者两步 _jumpStep，用于记录鼠标的输入，并将其转化为数值。因为我们规定角色最多只能跳两步，那么他可能是 1 或者 2。
    private _jumpStep: number = 0;
    // 当前的跳跃时间：_curJumpTime，每次跳跃前，将这个值置为 0，在更新时进行累计并和 _jumpTime 进行对比，如果超过了 _jumpTime，那么我们认为角色完成了一次完整的跳跃
    private _curJumpTime: number = 0;
    // 跳跃时间：_jumpTime，这个数值类型的变量用于记录整个跳跃的时长
    private _jumpTime: number = 0.1;
    // 移动速度：_curJumpSpeed，用于记录跳跃时的移动速度
    private _curJumpSpeed: number = 0;
    // 当前的位置：_curPos，记录和计算角色的当前位置
    private _curPos: Vec3 = new Vec3();
    // 位移： _deltaPos，每一帧我们都需要记录下位置和时间间隔的乘积，我们将用他来存储计算结果
    private _deltaPos: Vec3 = new Vec3(0, 0, 0);
    // 目标位置：_targetPos，最终的落点，我们将在跳跃结束时将角色移动这个位置以确保最终的位置正确，这样可以处理掉某些误差的情况
    private _targetPos: Vec3 = new Vec3();

    // 监听鼠标输入
    onMouseUp(event: EventMouse){
        if(event.getButton()===0){
            // 左键跳一步
            this.jumpByStep(1);
        } else if (event.getButton() === 2) {
            // 右键跳两步
            this.jumpByStep(2);
        }
    }

    jumpByStep(step: number){
        if (this._startJump) {
            return;
        }
        this._startJump = true;
        this._jumpStep = step;
        this._curJumpTime = 0;
        this._curJumpSpeed = this._jumpStep * BLOCK_SIZE/ this._jumpTime;
        this.node.getPosition(this._curPos);
        Vec3.add(this._targetPos, this._curPos, new Vec3(this._jumpStep* BLOCK_SIZE, 0, 0));

        if (this.BodyAnim) {
            if (step === 1) {
                this.BodyAnim.play('oneStep');
            } else if (step === 2) {
                this.BodyAnim.play('twoStep');
            }
        }
    }


    start() {
        input.on(Input.EventType.MOUSE_UP, this.onMouseUp, this);
    }

    update(deltaTime: number) {
        if (this._startJump) {
            this._curJumpTime += deltaTime; // 累计总的跳跃时间
            if (this._curJumpTime > this._jumpTime) { // 当跳跃时间是否结束
                // end
                this.node.setPosition(this._targetPos); // 强制位置到终点
                this._startJump = false;               // 清理跳跃标记
            } else {
                // tween
                this.node.getPosition(this._curPos);
                this._deltaPos.x = this._curJumpSpeed * deltaTime; //每一帧根据速度和时间计算位移
                Vec3.add(this._curPos, this._curPos, this._deltaPos); // 应用这个位移
                this.node.setPosition(this._curPos); // 将位移设置给角色
            }
        }
    }
}


